<?php

namespace Mogod\Core\Model;

/**
 * Абстрактный класс опций модели.
 *
 * @author goorus, morph
 *
 * @method void work() Вызывается до выполения запроса.
 *
 */
abstract class ModelOption
{

	/**
	 * Аргументы
	 *
	 * @var array
	 */
	protected $arguments;

	/**
	 * Коллекция, на которую наложен опшн
	 *
	 * @var ModelQuery
	 */
	protected $context;

	/**
	 * Запрос на выбор данных
	 *
	 * @var \Mogod\Core\Query\Query
	 */
	protected $query;

	/**
	 * Создает и возвращает опцию
	 *
	 * @param mixed $_ [optional]
	 */
	public function __construct()
	{
		$this->arguments = func_get_args();
	}

	/**
	 * Применить для контекста и запроса
	 *
	 * @param ModelQuery $context
	 * @param \Mogod\Core\Query\Query $query
	 */
	public function applyOn($context, $query)
	{
		$this->context = $context;
		$this->query = $query;

		call_user_func_array(array($this, 'work'), $this->arguments);

		$this->context = $this->query = null;
	}

	/**
	 * Возвращает аргументы
	 *
	 * @return array
	 */
	public function getArguments()
	{
		return $this->arguments;
	}

	/**
	 *
	 * @return ModelQuery
	 */
	public function getContext()
	{
		return $this->context;
	}


	/**
	 *
	 * @return \Mogod\Core\Query\Query
	 */
	public function getQuery()
	{
		return $this->query;
	}

	/**
	 *
	 * @param ModelQuery $context
	 * @return $this
	 */
	public function setContext($context)
	{
		$this->context = $context;
		return $this;
	}

	/**
	 *
	 * @param \Mogod\Core\Query\Query $query
	 * @return $this
	 */
	public function setQuery($query)
	{
		$this->query = $query;
		return $this;
	}

}